package com.gs.domain.wrapper;

import java.sql.Connection;
import java.util.Iterator;
import java.util.Observable;
import java.util.Set;
import java.util.Vector;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.gs.business.DBUtil;
import com.gs.business.cache.CacheGruppi;
import com.gs.domain.Budget;
import com.gs.domain.CatSpese;
import com.gs.domain.Entrate;
import com.gs.domain.Gruppi;
import com.gs.domain.ICatSpese;
import com.gs.domain.SingleSpesa;
import com.molinari.jdbcandroid.wrap.ConnectionAndroid;
import comi.gsi.command.javabeancommand.AbstractOggettoEntita;
import comi.gsi.command.javabeancommand.IWrapperEntity;
import comi.gsi.db.LineStackTracePrinter;

public class WrapCatSpese extends Observable implements IWrapperEntity, ICatSpese {

	private final CatSpese categoria;

	public WrapCatSpese() {
		categoria = new CatSpese();
	}

	public WrapCatSpese(final CatSpese cat) {
		this.categoria = cat;
	}

	@Override
	public Object selectById(final int id) {
		final Connection cn = DBUtil.getConnection();

		CatSpese categorie = null;

		try {

			ConnectionAndroid cnAndroid = (ConnectionAndroid) cn;
			String[] idCategoriaString = new String[] { Integer.toString(id) };
			String orderBy = CatSpese.NOME + " desc";

			final Cursor rs = cnAndroid.getDb().query(CatSpese.NOME_TABELLA, null, Entrate.ID + " = ?", idCategoriaString, null, null, orderBy);
			if (rs.moveToFirst()) {
				do {
					categorie = new CatSpese();
					final Gruppi gruppo = CacheGruppi.getSingleton().getGruppo(Integer.toString(rs.getInt(4)));
					setCategoriaFromCursor(categorie, rs, gruppo);
				} while (rs.moveToNext());
			}

			if (rs != null && !rs.isClosed()) {
				rs.close();
			}
			cnAndroid.close();
		} catch (Exception e) {
			Log.e(e.getClass().getName(), LineStackTracePrinter.scriviLineaDellErrore());
		}
		return categorie;
	}

	private void setCategoriaFromCursor(final CatSpese categorie, final Cursor rs, final Gruppi gruppo) {
		categorie.setidCategoria(rs.getInt(0));
		categorie.setdescrizione(rs.getString(1));
		categorie.setimportanza(rs.getString(2));
		categorie.setnome(rs.getString(3));
		if (gruppo != null) {
			categorie.setGruppi(gruppo);
		}
	}

	@Override
	public Iterator<Object> selectWhere(final String where) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Vector<Object> selectAll() {
		final Vector<Object> categorie = new Vector<Object>();
		final Connection cn = DBUtil.getConnection();
		ConnectionAndroid cnAndroid = (ConnectionAndroid) cn;
		try {
			String orderBy = CatSpese.NOME + " desc";
			Cursor cursor = cnAndroid.getDb().query(CatSpese.NOME_TABELLA, null, null, null, null, null, orderBy);
			if (cursor.moveToFirst()) {
				do {
					final CatSpese categoria = new CatSpese();
					final Gruppi gruppo = CacheGruppi.getSingleton().getGruppo(Integer.toString(cursor.getInt(4)));
					setCategoriaFromCursor(categoria, cursor, gruppo);
					categorie.add(categoria);
				} while (cursor.moveToNext());
			}
			if (cursor != null && !cursor.isClosed()) {
				cursor.close();
			}
			cnAndroid.close();

		} catch (final Exception e) {
			e.printStackTrace();
		}
		return categorie;

	}

	@Override
	public boolean insert(final Object oggettoEntita) {

		final ConnectionAndroid cnAndroid = (ConnectionAndroid) DBUtil.getConnection();
		final SQLiteDatabase db = cnAndroid.getDb();

		final CatSpese categoria = (CatSpese) oggettoEntita;

		ContentValues values = new ContentValues();
		values.put(CatSpese.DESCRIZIONE, categoria.getdescrizione());
		values.put(CatSpese.IMPORTANZA, categoria.getimportanza());
		values.put(CatSpese.NOME, categoria.getNomeEntita());

		if (categoria.getGruppi() != null) {
			values.put(CatSpese.IDGRUPPO, categoria.getGruppi().getidGruppo());
		}

		if (db.insert(CatSpese.NOME_TABELLA, null, values) == -1) {
			return false;
		}
		DBUtil.chiudiElementiDb(cnAndroid, null);
		return true;

	}

	@Override
	public boolean delete(final int id) {
		ConnectionAndroid cnAndroid = (ConnectionAndroid) DBUtil.getConnection();
		final SQLiteDatabase db = cnAndroid.getDb();
		String[] idCategoria = new String[] { Integer.toString(id) };

		if (db.delete(CatSpese.NOME_TABELLA, CatSpese.ID + " = ?", idCategoria) == 0) {
			return false;
		}
		DBUtil.chiudiElementiDb(cnAndroid, null);
		return true;
	}

	@Override
	public boolean update(final Object oggettoEntita) {
		ConnectionAndroid cnAndroid = (ConnectionAndroid) DBUtil.getConnection();
		final CatSpese categoria = (CatSpese) oggettoEntita;
		final SQLiteDatabase db = cnAndroid.getDb();
		final ContentValues args = new ContentValues();
		args.put(CatSpese.NOME, categoria.getNomeEntita());
		args.put(CatSpese.DESCRIZIONE, categoria.getdescrizione());
		args.put(CatSpese.IMPORTANZA, categoria.getimportanza());
		args.put(CatSpese.IDGRUPPO, categoria.getGruppi() != null ? categoria.getGruppi().getidGruppo() : 0);
		try {
			if (db.update(Entrate.NOME_TABELLA, args, Entrate.ID + " = " + categoria.getIdEntita(), null) > 0) {
				cnAndroid.close();
				return true;
			}

		} catch (Exception e) {
		}
		return false;
	}

	@Override
	public boolean deleteAll() {
		ConnectionAndroid cnAndroid = (ConnectionAndroid) DBUtil.getConnection();;
		final SQLiteDatabase db = cnAndroid.getDb();
		if (db.delete(CatSpese.NOME_TABELLA, "1", null) == -1) {
			return false;
		}

		DBUtil.chiudiElementiDb(cnAndroid, null);

		return true;
	}

	@Override
	public AbstractOggettoEntita getEntitaPadre() {
		return categoria;
	}

	@Override
	public String getdescrizione() {
		return categoria.getdescrizione();
	}

	@Override
	public void setdescrizione(final String descrizione) {
		categoria.setdescrizione(descrizione);
	}

	@Override
	public int getidCategoria() {
		return categoria.getidCategoria();
	}

	@Override
	public void setidCategoria(final int idCategoria) {
		categoria.setidCategoria(idCategoria);
	}

	@Override
	public String getimportanza() {
		return categoria.getimportanza();
	}

	@Override
	public void setimportanza(final String importanza) {
		categoria.setimportanza(importanza);
	}

	@Override
	public String getNomeEntita() {
		return categoria.getNomeEntita();
	}

	@Override
	public void setnome(final String nome) {
		categoria.setnome(nome);
	}

	@Override
	public Budget getBudget() {
		return categoria.getBudget();
	}

	@Override
	public void setBudget(final Budget budget) {
		categoria.setBudget(budget);
	}

	@Override
	public Gruppi getGruppi() {
		return categoria.getGruppi();
	}

	@Override
	public void setGruppi(final Gruppi gruppi) {
		categoria.setGruppi(gruppi);
	}

	@Override
	public Set<SingleSpesa> getSingleSpesas() {
		return categoria.getSingleSpesas();
	}

	@Override
	public void setSingleSpesas(final Set<SingleSpesa> singleSpesas) {
		categoria.setSingleSpesas(singleSpesas);
	}

	@Override
	public void notifyObservers() {
		super.notifyObservers();
	}

	@Override
	public synchronized void setChanged() {
		super.setChanged();
	}

	@Override
	public AbstractOggettoEntita getEntita() {
		return getEntitaPadre();
	}

}
